#ifndef __CAN_SIMPLE_H_
#define __CAN_SIMPLE_H_
#include "stm32g4xx.h"
#include "can_helpers.h"
#include "axis.h"



void handle_can_message(AXIS *axis, can_Message_t msg);
void send_heartbeat(AXIS *axis);

void nmt_callback(AXIS *axis, can_Message_t msg);
void estop_callback(AXIS *axis, can_Message_t msg);
void get_motor_error_callback(AXIS *axis, can_Message_t msg);
void get_encoder_error_callback(AXIS *axis, can_Message_t msg);
void get_controller_error_callback(AXIS *axis, can_Message_t msg);
void get_drive_error_callback(AXIS *axis, can_Message_t msg);
void set_axis_nodeid_callback(AXIS *axis, can_Message_t msg);
void set_axis_requested_state_callback(AXIS *axis, can_Message_t msg);
void set_axis_motion_synchronization_callback(AXIS *axis, can_Message_t msg);
void get_encoder_estimates_callback(AXIS *axis, can_Message_t msg);
void get_encoder_count_callback(AXIS *axis, can_Message_t msg);
void set_input_pos_callback(AXIS *axis, can_Message_t msg);
void set_input_vel_callback(AXIS *axis, can_Message_t msg);
void set_input_acc_limit_callback(AXIS *axis, can_Message_t msg);
void set_controller_modes_callback(AXIS *axis, can_Message_t msg);
void set_vel_limit_callback(AXIS *axis, can_Message_t msg);
void start_anticogging_callback(AXIS *axis, can_Message_t msg);
void set_traj_vel_limit_callback(AXIS *axis, can_Message_t msg);
void set_traj_accel_limits_callback(AXIS *axis, can_Message_t msg);
void set_traj_inertia_callback(AXIS *axis, can_Message_t msg);
void get_iq_callback(AXIS *axis, can_Message_t msg);
void get_sensorless_estimates_callback(AXIS *axis, can_Message_t msg);
void get_reset_motor_callback(AXIS *axis, can_Message_t msg);
void get_vbus_voltage_callback(AXIS *axis, can_Message_t msg);
void clear_errors_callback(AXIS *axis, can_Message_t msg);
void set_linear_count_callback(AXIS *axis, can_Message_t msg);

// Utility functions
uint32_t get_node_id(uint32_t msgID);
uint32_t get_cmd_id(uint32_t msgID); 

// Fetch a specific signal from the message

// This functional way of handling the messages is neat and is much cleaner from
// a data security point of view, but it will require some tweaking
//
// const std::map<uint32_t, std::function<void(can_Message_t&)>> callback_map = {
//     {0x000, std::bind(&CANSimple::heartbeat_callback, this, _1)}
// };


		
//typedef struct{


//		
//}CAN_SIMPLE;




#endif

